#include "HeaderFrase.h"
#include <math.h>


HeaderFrase::HeaderFrase(unsigned int tam) : IHeader(tam)
{
	this->cantBloques = 1;
}

HeaderFrase::~HeaderFrase() { }


unsigned int HeaderFrase::getPosBloqueLibre(){
	// Si en el mapa de bits hay algun bloque libre se lo busca y se devuelve su posicion
	if ( this->mapaBloquesLibres.any() ){

		// Busca cual es la posicion del bloque libre
		for (unsigned int i = 0; i < this->mapaBloquesLibres.size(); ++i){
			if (this->mapaBloquesLibres.test(i)) return i;
		}

	}

	// No hay ningun bloque libre en el mapa de bits, se debe insertar al final del archivo
	return -1;
}


void HeaderFrase::liberarBloque(const unsigned int pos){
	if (pos > this->mapaBloquesLibres.size()) return;

	this->mapaBloquesLibres[pos] = true;
}


unsigned int HeaderFrase::getSize() const{
	unsigned int tam = sizeof(this->cantBloques);
	tam += ceil( static_cast<double>(this->mapaBloquesLibres.size() / 8) );

	return tam;
}


unsigned int HeaderFrase::serialize(char* &arr){
	this->serInator.reset();
	this->serInator.serializar(arr, this->cantBloques);
	this->serInator.serializar<1024>(arr, this->mapaBloquesLibres);

	return this->serInator.getBufferSize();
}


void HeaderFrase::deSerialize(char* arr){
	this->serInator.reset();
	this->serInator.desSerializar(arr, this->cantBloques);
	this->serInator.desSerializar<1024>(arr, this->mapaBloquesLibres);
}


